package com.sys.midware.config.core;

import java.util.List;
import java.util.Map;

import com.sys.midware.assist.utils.Assert;
import com.sys.midware.assist.utils.string.StringUtil;
import com.sys.midware.config.model.BNode;
import com.sys.midware.logger.Logger;
import com.sys.midware.logger.LoggerFactory;

/**
 * 
 * <b>ClassName：</b> ConfigContainer <br/>
 * <b>Description：</b> 用于编程式加载配置文件 <br/>
 * <b>@author：</b> mobing <br/>
 * <b>@date：</b> 2015年10月19日 下午12:52:25 <br/>
 * <b>@version: </b> <br/>
 */
public class ConfigContainer {

    private static final Logger logger = LoggerFactory.getLogger(ConfigContainer.class);

    private static final ConfigContainer instance = new ConfigContainer();

    private ConfigContainer() {}

    public static ConfigContainer getInstance() {
        return instance;
    }

    public static ConfigContainer getInstance(String configFile) {
        logger.info("ConfigContainer begin...");
        ConfigCore  configCore =  ConfigCore.getInstance(configFile);
        configCore.init();
        logger.info("ConfigContainer finish!");
        return instance;
    }
    private static Configuration globleConfig;
    /**
     * 从config上下文中加载config对象
     * getConfigration 
     * @param  
     * @return  Configuration
     */
    public Configuration getConfigration() {
        //如果是多线程环境，则走全局
        if(ConfigContext.getConfiguration()==null){
            return globleConfig;
        }
        return ConfigContext.getConfiguration();
    }
    public static  void setConfigration(Configuration configuration) {
        globleConfig =configuration;
    }
    /**
     * 获取配置参数集合
     * 
     * @return
     */
    public Map<String, Object> getParams() {
        return getConfigration().getParams();
    }

    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public Object getParam(String key) {
        if(StringUtil.isEmpty(key)){
            Assert.isNull(key, "参数key"+key+"为空");
        }
        Object obj =getConfigration().getParam(key);
        if(obj ==null){
            return null;
        }
        return obj;
    }
    
    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public String getParamString(String key) {
        
       Object obj = getParam(key);
       if(obj!=null ){
           return String.valueOf(obj);
       }
        return null;
    }
    
    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public Integer getParamInteger(String key) {
        
        if(getParamString(key)==null){
            return null;
        }
        
        return Integer.valueOf(getParamString(key));
    }
    
    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public Long getParamLong(String key) {
        
        if(getParamString(key)==null){
            return null;
        }
        
        return Long.valueOf(getParamString(key));
    }
    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public Boolean getParamBoolean(String key) {
        if(getParamString(key)==null){
            return null;
        }
        return Boolean.valueOf(getParamString(key));
    }
    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public List<BNode> getBNodeList() {
        
          return getConfigration().getBNodeList();
    }
    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public BNode getParamBNode(String nodeName) {
        
          return getConfigration().getBNode(nodeName);
    }
    
    
    /**
     * 依据配置参数名称，获取其配置参数值
     * 
     * @param key
     * @return 参数值对象；若不存在，则返回null
     */
    public String getParamBNodeParamStr(String nodeName,String key) {
        
          return getConfigration().getBNodeParamString(nodeName, key);
    }
    /**
     * 依据配置参数名字，移除配置参数
     * 
     * @param key
     *            参数名
     */
    public void removeParam(String key) {
        getConfigration().removeParam(key);
    }
    
    /**
     * 添加配置参数
     * 
     * @param key
     *            参数名字
     * @param value
     *            参数值
     */
    public void addParam(String key, Object value) {
        getConfigration().addParam(key, value);
    }

}
